# 第 16 章 非入侵监控设计,ASM 字节码插桩

作者:小傅哥
博客:https://bugstack.cn (opens new window)

沉淀、分享、成长,让自己和他人都能有所收获!

# 一、前言

如果你只写CRUD,那很多技术你压根接触不到!

其实很大一部分程序员包括你我,常常都在忙于业务开发或奔波在日常维护与修复 BUG 的路上,当不能从中吸取技术营养与改变现状后,就像一台恒定运行的机器,逃不出限定宇宙速度的一个圈里。

可能你也会有自己的难处,平时加班太晚没有时间学习、周末家里琐事太多没有精力投入,放假计划太满没有空闲安排。总之,学习就会被搁置。而当一年年的过去后,当自己的年龄与能力不成匹配后又会后悔没有给多投入一些时间学习成长。

尤其是一线编码的技术人,除了我们所能看到的在技术框架里(SSM)开发的业务代码,你是否有遇到过学习瓶颈,而这种瓶颈又是你自己不知道自己不会什么,就像你可能压根没了解过字节码插装,也不知道 ASM、Javassist、Byte-Buddy 都是什么。

# 二、需求背景

在大型的互联网架构体系中,有一块非常重要的技术服务支撑就是监控系统。这是因为在系统的运行过程中需要时刻监测系统的运行健康度,QPS、TPS、可用率、响应时常、调用量、负载、CPU等等信息,而一般最早的监控系统通常需要在业务工程中硬编码的方式采集方法信息,但这样的做法对系统的破坏性较大,同时每个系统都开发这样补丁监控就显得非常麻烦,也不易于维护和升级。

后来以谷歌的 Dapper 为参考,开发大规模分布式系统的跟踪系统,这样的系统在实现上是非入侵式的,可以在工程加载时通过字节码插装给方法增强,采集必要信息汇总到服务端平台,展示出各个系统中方法的监控状况。

所以我们这里就尝试使用 ASM 这样的字节码框架,来做字节码增强的设计,采集方法执行时的信息。